/**
  * Author: Mei
  * Date: 2020-11-22 14:16
  * Description: 
  *
  */
#include <iostream>
#include <thread>

using namespace std;

class my_thread{
public:
    explicit my_thread(thread& t_):t(t_){}
    ~my_thread(){
        if(t.joinable()){ //  -------->①
            cout << "aaaa" << endl;
            t.join();//  -------->②
        }
    }
    my_thread(my_thread const&) = delete;//  -------->③
    my_thread& operator=(const my_thread&) = delete;
private:
    thread& t;
};

class func{
public:
    int& data;
    func(int& d):data(d){}
    void operator()(int a){
        cout << a << endl;
        cout << "thread started@@@@@@@@@@@@@@@@@@@@@@@@@@" << endl;
        for(unsigned j = 0; j < 100; ++j){
            cout << j << endl;
        }
    }
};
/*
 * 知识点1：当程序执行到④处时，局部对象会被销毁，所以mt的析构函数就会被调用。
 * 即使在do_something_in_current_thread();处发生异常了，
 * mt的析构函数也会被调用，所以，join函数不管在什么情况下都会被调用。
    知识点2：在②处调用join前，必须要先判断是不是joinable①。这很重要，
    因为只能join一次，多次join就会出下面错误。
 *
 *
 *
 */
int main(){
    int state = 0;
    func f(state);
    thread t(f, 12);
    my_thread mt(t);

    //do_something_in_current_thread();
}//  -------->④